package org.jw.testemunhopublico.repository.dao.impl;

import java.util.List;

import javax.persistence.Query;

import org.jw.testemunhopublico.repository.dao.MensagemDaoIF;
import org.jw.testemunhopublico.repository.entities.Mensagem;
import org.jw.testemunhopublico.util.CollectionsUtil;
import org.jw.testemunhopublico.util.Constantes;
import org.springframework.stereotype.Repository;

@Repository
public class MensagemDao extends GenericDao<Mensagem> implements MensagemDaoIF {

	private static final long serialVersionUID = -587903092890938462L;
	
	public static final String DEFAULT_LOCALE_QUERY = "(SELECT p.value FROM Parametro p WHERE p.key = '"
			+ Constantes.PARAMETRO_DEFAULT_LOCALE + "')";

	public Mensagem getMensagem(String mnemonico) {
		return getMensagem(mnemonico, null);
	}

	public Mensagem getMensagem(String mnemonico, String locale) {
		beginTransaction();

		String queryString = "";
		if(locale != null)
			queryString = "SELECT m FROM Mensagem m WHERE m.locale = :locale AND m.mnemonico = :mnemonico";
		else
			queryString = "SELECT m FROM Mensagem m WHERE m.locale = "
					+ DEFAULT_LOCALE_QUERY + " AND m.mnemonico = :mnemonico";

		Query query = manager.createQuery(queryString).setParameter("mnemonico", mnemonico);
		
		if(locale != null)		
			query = query.setParameter("locale", locale);
		
		Mensagem result = (Mensagem) query.getSingleResult();

		commitAndCloseTransaction();

		return result;
	}

	public List<Mensagem> listMensagens() {
		return listMensagens(null);
	}

	public List<Mensagem> listMensagens(String locale) {
		beginTransaction();

		String queryString = "";		
		if(locale != null)
			queryString = "SELECT m FROM Mensagem m WHERE m.locale = :locale";
		else
			queryString = "SELECT m FROM Mensagem m WHERE m.locale = "
					+ DEFAULT_LOCALE_QUERY;
		
		Query query = manager.createQuery(queryString);
				
		if(locale != null)		
			query = query.setParameter("locale", locale);
		
		List<Mensagem> result = query.getResultList();

		commitAndCloseTransaction();

		if (!CollectionsUtil.isBlank(result))
			return result;
		return null;
	}

}
